package com.live2d.service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigInteger;

/**
 * live2d文件处理程序
 * 获取文件最后一个UnityFS字符的位置，把前面的字符删除
 */
public class Live2dFileHandle {

    public static void main(String[] args) {
        File file = new File("D:\\软件\\wnxxgj_zhiyaozhugeliang_01.asset");
        String sb = readFileData(file);
        boolean contains = sb.contains("556e6974794653000000000");
        System.out.println("文件有无UnityFS："+contains);
        System.out.println(sb.lastIndexOf("556e6974794653000000000"));
        //获取最后一个UnityFS到结束的数据
        sb = sb.substring(sb.lastIndexOf("556e6974794653000000000"));
        byte[] bytes = hexString2Bytes(sb);
        writeFileData(file,bytes);
    }

    /**
     * 读取文件数据转为16进制字符串
     */
    public static String readFileData(File file)  {
        FileInputStream fis = null;
        String data = "";
        try{
            fis  =new FileInputStream(file);
            //todo 一次性读取数据，要不然会出错
            byte[] buf=new byte[(int)file.length()];
            int tempByte=-1;
            long value=0;
            while((tempByte=fis.read(buf))!=-1){
                String s = bytes2hex01(buf);//将字节数组转换为16进制字符串
                data +=s;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                fis.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return data;
    }
    /**
     * 保存文件数据
     */
    public static void writeFileData(File file,byte[] bytes){
        FileOutputStream fos  = null;
        try{
            fos = new FileOutputStream(file);
            fos.write(bytes);
            fos.flush();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                fos.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }








    /**
     * 字节数组转16进制
     * @param bytes
     * @return
     */
    public static String bytes2hex01(byte[] bytes) {
        /**
         * 第一个参数的解释，记得一定要设置为1
         *  signum of the number (-1 for negative, 0 for zero, 1 for positive).
         */
        BigInteger bigInteger = new BigInteger(1, bytes);
        return bigInteger.toString(16);
    }

    /**
     * 将16进制字符串转为字节数组，16进制的字符串一定是偶数的
     * @param content 16进制字符串
     * @return 字节数组
     */
    public static byte[] hexString2Bytes(String content) {
        //一个字节可以转为2个16进制的字符
        int length = content.length()/2;
        byte[] result = new byte[length];
        for (int i = 0; i < length; i++) {
            //获取每个字节的高4位
            int high4 = Integer.parseInt(content.substring(i * 2, i * 2 + 1), 16);
            //获取每个字节的低4位
            int low4 = Integer.parseInt(content.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high4*16 + low4);
        }
        return result;

    }
}
